#include <string>
#include <algorithm>

using namespace std;


// 每个元音包含偶数次的最长子字符串
// 给你一个字符串 s ，请你返回满足以下条件的最长子字符串的长度
// 每个元音字母，即 'a'，'e'，'i'，'o'，'u'
// 在子字符串中都恰好出现了偶数次。
// 测试链接 : https://leetcode.cn/problems/find-the-longest-substring-containing-vowels-in-even-counts/

class Solution 
{
private:
    int index(char ch)
    {
        switch(ch)
        {
            case 'a': return 0;
            case 'e': return 1;
            case 'i': return 2;
            case 'o': return 3;
            case 'u': return 4;
            default: return -1;
        }
    }

public:
    int findTheLongestSubstring(string s) 
    {
        int n = s.size();
		// 只有 5 个元音字符，状态就 5 位
        int m[32];
        fill(m, m + 32, -2);
        // map[0...31] = -2
		// map[01100] = -2, 这个状态之前没出现过
        m[0] = -1;
        int ans = 0;
        for(int i = 0, status = 0; i < n; ++i)
        {
            // status : 0....i-1 字符串上，aeiou 的奇偶性
			// s[i] = 当前字符
			// 情况1 : 当前字符不是元音，status 不变
			// 情况2 : 当前字符是元音，a~u(0~4)，修改相应的状态
            int idx = index(s[i]);
            if(idx != -1)
            {
                status ^= 1 << idx;
            }
            // status:  0....i 字符串上，aeiou 的奇偶性
			// 同样的状态，之前最早出现在哪
            if(m[status] != -2) ans = max(ans, i - m[status]);
            else m[status] = i;
        }
        return ans;
    }
};